package main

import (
	"fmt"
)

/*
验证二叉搜索树/判断是不是二叉搜索树
给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。
*/

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

/*
有效 二叉搜索树定义如下：
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
二叉搜索树的中序遍历是递增的

中序遍历时，判断当前节点是否大于中序遍历的前一个节点，如果大于，说明满足BST，继续遍历；否则直接返回 false。
*/

//递归
func isValidBST(root *TreeNode) bool {
	var mid func(node *TreeNode)
	var res []int
	mid = func(node *TreeNode) {
		if node == nil {
			return
		}
		mid(node.Left)
		res = append(res, node.Val)
		mid(node.Right)
	}
	mid(root)
	for i := 1; i < len(res); i++ {
		if res[i] <= res[i-1] {
			return false
		}
	}
	return true
}

func main() {
	A := &TreeNode{Val: 1}
	A.Left = &TreeNode{Val: 2}
	A.Right = &TreeNode{Val: 3}
	fmt.Println(isValidBST(A))
}
